package com.yk.common.service;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Service
public class TokenService {

    /**
     * 密钥
     */
    @Value("${jwt.secret}")
    private String secret;

    /**
     * 令牌有效期（毫秒）
     */
    @Value("${jwt.expireTime}")
    private long expireTime;

    /**
     * 生成令牌
     * @param openId 用户 openId
     * @return 令牌
     */
    public String generateToken(String openId) {

//        Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);

        Map<String, Object> claims = new HashMap<>();
        claims.put("openId", openId);
        return Jwts.builder()
                .setClaims(claims)
                .setSubject(openId)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + expireTime))
                .signWith(Keys.secretKeyFor(SignatureAlgorithm.HS256))
                .compact();
    }

    /**
     * 解析令牌
     * @param token 令牌
     * @return 解析结果
     */
    public Claims parseToken(String token) {
        return Jwts.parser()
                .setSigningKey(secret)
                .parseClaimsJws(token)
                .getBody();
    }

    /**
     * 验证令牌是否过期
     * @param token 令牌
     * @return 是否过期
     */
    public boolean isTokenExpired(String token) {
        final Date expiration = parseToken(token).getExpiration();
        return expiration.before(new Date());
    }
}